import os
import re
import shutil
import time


# 遍历目录下所有文件，返回文件路径列表
# 输入的是绝对路径则返回绝对路径，输入的是相对路径则返回相对路径
def getfilelist(filetype, path='./',):#默认从当前路径下找
    file_list = list()
    if os.path.isdir(path):
        for dirpath, dirnames, filenames in os.walk(path):
            for filename in filenames:
                if filename.endswith(filetype):#endswith里面可以跟一个元组
                    file = os.path.join(dirpath, filename)
                    file_list.append(file)
    elif path.endswith(filetype):
        file_list.append(path)
    return file_list


# 把pic_list中的路径统一都改为反斜杠
def changeformat(pic_list):
    new_pic_list = list()
    for pic in pic_list:
        pic = pic.replace('/', '\\')
        new_pic_list.append(pic)
    return new_pic_list


# 读取文件，默认以文本读取，编码类型为utf-8
def readfromfile(file, readmode='r', encoding='utf-8'):
    with open(file, readmode, encoding=encoding) as f:
        text = f.read()
    return text


def main(md_path, pic_path, model, is_delect='no'):
    print('开始搜索md文件和图片文件...')
    md_list = getfilelist(path=md_path, filetype='.md')
    pic_list = getfilelist(path=pic_path, filetype=('.png', '.jpg', '.jpeg'))
    pic_list = changeformat(pic_list)

    alive_pic_list = list()
    print('开始遍历md文件内容...')
    for md in md_list:
        print(md)
        text = readfromfile(md)
        # 但凡pic在md中，这个pic就不能删#遍历图片列表每次都和文件内容进行匹配，如果有10张图5个文件，
        # 就需要匹配5*10次
        # 效率太低，改用正则匹配
        if model:
            for pic in pic_list:
                if pic in text and not (pic in alive_pic_list):
                    alive_pic_list.append(pic)
        else:
            #使用正则匹配文中的图片引用
            rule = re.compile("!\[.*?\d+\]\((.*?)\)",re.I)
            result = rule.findall(text)
            #为了防止列表里出现重复值，但是影响不大的话可以直接extend
            for pic in result:
                if pic not in alive_pic_list:
                    alive_pic_list.append(pic)
    print('开始清理无效图片...')
    if is_delect == 'yes':
        for pic in pic_list:
            if not (pic in alive_pic_list):
                print("删除：",pic)
                os.remove(pic)
    if is_delect == 'no':
        mask = 0
        bak_dir_parent = os.path.dirname(os.path.realpath(__file__))
        bak_dir = os.path.join(bak_dir_parent,'typroa_image_bak_'+time.strftime("%Y%m%d%H%M%S", time.localtime()))
        # print(bak_dir)
        if not os.path.exists(bak_dir):
            os.mkdir(bak_dir)
        for pic in pic_list:
            if not (pic in alive_pic_list):
                print('移动：', pic)
                shutil.move(pic,bak_dir)
                mask = 1
        if mask:
            print("保存到“{}”目录".format(bak_dir))
            print('完成')
        else:
            print(">>>>>>>>>>无失效图片<<<<<<<<<<")
            os.rmdir(bak_dir)


if __name__ == '__main__':
    # md路径(可以是目录也可以是具体md文件)
    # md_path = r'C:\Users\shenyangyang\Desktop\嵌入式笔记\1.linux.md'
    md_path = r'C:\Users\shenyangyang\Desktop\嵌入式笔记'
    # 图片保存路径
    pic_path = r'D:\typroa_image'
    #文件中图片搜索模式（1或0，0使用正则匹配(更快)，但不同typroa版本存在格式不同的风险）
    model = 0
    #是否删除 yes 直接删除，no移动到备份目录
    is_delect='no'
    main(md_path, pic_path, model, is_delect)
